package cn.lili.common.enums;

import cn.lili.common.vo.ResultMessage;

/**
 * 返回结果工具类
 *
 * @author lili
 */
public class ResultUtil<T> {

	/**
	 * 抽象类，存放结果
	 */
	private final ResultMessage<T> resultMessage;
	/**
	 * 正常响应
	 */
	private static final Integer SUCCESS = 200;

	/**
	 * 构造话方法，给响应结果默认值
	 */
	public ResultUtil() {
		resultMessage = new ResultMessage<>();
		resultMessage.setSuccess(true);
		resultMessage.setMessage("success");
		resultMessage.setCode(SUCCESS);
	}

	/**
	 * 返回数据
	 *
	 * @param t
	 *            范型
	 * @return 消息
	 */
	public ResultMessage<T> setData(T t) {
		this.resultMessage.setResult(t);
		return this.resultMessage;
	}

	/**
	 * 返回成功消息
	 *
	 * @param resultCode
	 *            返回码
	 * @return 返回成功消息
	 */
	public ResultMessage<T> setSuccessMsg(ResultCode resultCode) {
		this.resultMessage.setSuccess(true);
		this.resultMessage.setMessage(resultCode.message());
		this.resultMessage.setCode(resultCode.code());
		return this.resultMessage;

	}

	/**
	 * 抽象静态方法，返回结果集
	 * 
	 * @param t
	 *            范型
	 * @param <T>
	 *            范型
	 * @return 消息
	 */
	public static <T> ResultMessage<T> data(T t) {
		return new ResultUtil<T>().setData(t);
	}

	/**
	 * 返回成功
	 *
	 * @param resultCode
	 *            返回状态码
	 * @return 消息
	 */
	public static <T> ResultMessage<T> success(ResultCode resultCode) {
		return new ResultUtil<T>().setSuccessMsg(resultCode);
	}

	/**
	 * 返回成功
	 * 
	 * @return 消息
	 */
	public static <T> ResultMessage<T> success() {
		return new ResultUtil<T>().setSuccessMsg(ResultCode.SUCCESS);
	}

	/**
	 * 返回失败
	 *
	 * @param resultCode
	 *            返回状态码
	 * @return 消息
	 */
	public static <T> ResultMessage<T> error(ResultCode resultCode) {
		return new ResultUtil<T>().setErrorMsg(resultCode);
	}

	/**
	 * 返回失败
	 *
	 * @param code
	 *            状态码
	 * @param msg
	 *            返回消息
	 * @return 消息
	 */
	public static <T> ResultMessage<T> error(Integer code, String msg) {
		return new ResultUtil<T>().setErrorMsg(code, msg);
	}

	/**
	 * 服务器异常 追加状态码
	 * 
	 * @param resultCode
	 *            返回码
	 * @return 消息
	 */
	public ResultMessage<T> setErrorMsg(ResultCode resultCode) {
		this.resultMessage.setSuccess(false);
		this.resultMessage.setMessage(resultCode.message());
		this.resultMessage.setCode(resultCode.code());
		return this.resultMessage;
	}

	/**
	 * 服务器异常 追加状态码
	 *
	 * @param code
	 *            状态码
	 * @param msg
	 *            返回消息
	 * @return 消息
	 */
	public ResultMessage<T> setErrorMsg(Integer code, String msg) {
		this.resultMessage.setSuccess(false);
		this.resultMessage.setMessage(msg);
		this.resultMessage.setCode(code);
		return this.resultMessage;
	}

}
